package com.leetcode.offer.chapter2;

/**
 * @author Dennis Li
 * @date 2020/7/12 15:20
 */
public class MatrixRoute_12 {

    // 回溯其实就是涉及回退的一种DFS算法 -- 注意回退的判定条件，即条件判定失效
    // 这时常通过合取关系来进行判定
    // 拒绝回溯这里采用了修改值

    public boolean exist(char[][] board, String word) {
        char[] chars = word.toCharArray();
        int high = board.length, width = board[0].length;
        for (int i = 0; i < high; i++) {
            for (int j = 0; j < width; j++) {
                if (dfs(board, chars, i, j, 0)) return true;
            }
        }
        return false;
    }

    public boolean dfs(char[][] board, char[] word, int i, int j, int k) {
        // 越界
        if (i < 0 || i > board.length || j < 0 || j > board[0].length ||
                // 如果对应位置的k不相等 -- 同样要进行回溯
                word[k] != board[i][j]) return false;
        // 相同的字符个数
        if (k == word.length - 1) return true;
        char temp = board[i][j];
        board[i][j] = '/'; // 通过临时更改值 -- 达到拒绝从这个方向回溯的效果
        // 分别向4个方向尝试移动
        boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1)
                || dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i, j - 1, k + 1);
        board[i][j] = temp; // 需要对值进行还原
        return res;
    }

}
